@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

:: ==============================================================================
:: [0] 固定使用 Python 3.12 的 DLL（硬编码路径）
:: ==============================================================================
set "PYTHON_DLL_NAME=python312.dll"
set "PYTHON_DLL_PATH=C:\Users\Administrator\AppData\Local\Programs\Python\Python312\python312.dll"

echo [环境] 检查 Python 环境...
python -c "import sys; assert sys.maxsize > 2**32, '❌ 必须使用 64 位 Python！'" || (
    echo ❌ 检测到非 64 位 Python 环境，构建已中止。
    pause
    exit /b 1
)

:: 双重验证 DLL 存在性
if not exist "!PYTHON_DLL_PATH!" (
    echo ❌ 指定的 Python DLL 不存在: !PYTHON_DLL_PATH!
    echo     请确认 Python 3.12 已安装在默认路径。
    pause
    exit /b 1
)
echo [信息] 使用固定的 Python DLL: !PYTHON_DLL_PATH!
:: 修复 DLL 文件大小显示
for %%f in ("!PYTHON_DLL_PATH!") do set "DLL_SIZE=%%~zf"
echo [信息] DLL 文件大小: !DLL_SIZE! 字节

:: ==============================================================================
:: 配置变量
:: ==============================================================================
set "RELEASE_DIR=release"
set "DIST_DIR=dist"
set "APP_NAME=DataCollector"
set "MAIN_APP_DIR=%DIST_DIR%\%APP_NAME%"  :: 主程序输出目录
set "MAIN_EXE=!MAIN_APP_DIR!\%APP_NAME%.exe"  :: 主程序路径（提前定义）
set "VERSION_FILE=!MAIN_APP_DIR!\version.txt"  :: 新增：version.txt目标路径变量

:: ==============================================================================
:: [1] 读取版本号
:: ==============================================================================
if not exist "version.txt" (
    echo ❌ 错误：version.txt 不存在！
    pause
    exit /b 1
)
for /f "usebackq delims=" %%v in ("version.txt") do set "VERSION=%%v"
echo [信息] 当前版本: %VERSION%

:: ==============================================================================
:: [2] 获取发布日期
:: ==============================================================================
for /f "delims=" %%d in ('powershell -command "(Get-Date).ToString('yyyy-MM-dd')" 2^>nul') do set "PUB_DATE=%%d"
if not defined PUB_DATE (
    echo ⚠️ 无法获取当前日期，使用默认值。
    set "PUB_DATE=1970-01-01"
)
echo [信息] 发布日期: %PUB_DATE%

:: ==============================================================================
:: [3] 清理旧构建产物
:: ==============================================================================
echo [清理] 删除旧的 build、dist、release 和缓存...
rmdir /s /q build "%DIST_DIR%" "%RELEASE_DIR%" 2>nul
for /d /r . %%d in (__pycache__) do @if exist "%%d" rmdir /s /q "%%d" 2>nul
mkdir "%RELEASE_DIR%" 2>nul
echo [清理] 完成！

:: ==============================================================================
:: [4] 更新 Inno Setup 脚本
:: ==============================================================================
if not exist "precompile.bat" (
    echo ❌ precompile.bat 不存在！请确保它位于项目根目录。
    pause
    exit /b 1
)
echo [准备] 调用 precompile.bat 更新 setup.iss...
call precompile.bat
if errorlevel 1 (
    echo ❌ precompile.bat 执行失败！
    pause
    exit /b 1
)
echo [准备] setup.iss 更新完成！

:: ==============================================================================
:: [5] 打包 updater.exe
:: ==============================================================================
echo.
echo [1/3] 打包 updater.exe...
pyinstaller --clean --onedir --console --name updater --add-data "logger.py;." updater.py
if errorlevel 1 (
    echo ❌ updater 打包失败！
    pause
    exit /b 1
)
:: 验证 updater 输出
if not exist "dist\updater\updater.exe" (
    echo ❌ updater.exe 未生成！
    pause
    exit /b 1
)
xcopy /Y "dist\updater\updater.exe" "%RELEASE_DIR%\" >nul
echo   ✅ updater.exe 已复制到发布目录。

:: ==============================================================================
:: [6] 打包主程序（目录模式）
:: ==============================================================================
echo.
echo [2/3] 打包主程序（目录模式）...
pyinstaller --clean --onedir --windowed --name "%APP_NAME%" --icon=assets/app.ico ^
    --hidden-import=bcrypt._bcrypt ^
    --add-binary "!PYTHON_DLL_PATH!;." ^
    --add-data "spiders;spiders" ^
    --add-data "config.json;." ^
    --add-data "utils;utils" ^
    --add-data "cookies;cookies" ^
    --add-data "version.txt;." ^
    --add-data "config;config" ^
    --add-data "config;version_checker" ^
    --add-data "config;update_manager" ^
    --add-data "logger.py;." ^
    --hidden-import=customtkinter ^
    --hidden-import=tkinter ^
    --hidden-import=PIL ^
    --hidden-import=requests ^
    main.py

:: 验证主程序目录生成
if not exist "!MAIN_APP_DIR!" (
    echo ❌ 主程序目录未生成！
    pause
    exit /b 1
)
echo   ✅ 主程序目录生成成功：!MAIN_APP_DIR!

:: 注入 updater.exe 到主程序目录
copy /Y "dist\updater\updater.exe" "!MAIN_APP_DIR!\" >nul
if exist "!MAIN_APP_DIR!\updater.exe" (
    echo   ✅ 已注入 updater.exe 到主程序目录。
) else (
    echo ⚠️ updater.exe 注入失败！
)

:: 手动复制 python312.dll
echo   [手动复制] 正在复制 !PYTHON_DLL_NAME!...
copy /Y "!PYTHON_DLL_PATH!" "!MAIN_APP_DIR!\" >nul
if exist "!MAIN_APP_DIR!\!PYTHON_DLL_NAME!" (
    echo   ✅ !PYTHON_DLL_NAME! 手动复制成功！
) else (
    echo ❌ !PYTHON_DLL_NAME! 复制失败！
    pause
    exit /b 1
)

:: 新增：强制手动复制version.txt到主程序目录（确保万无一失）
echo   [手动复制] 正在复制 version.txt 到主程序目录...
copy /Y "version.txt" "!MAIN_APP_DIR!\" >nul
if exist "!VERSION_FILE!" (
    echo   ✅ version.txt 手动复制成功！
) else (
    echo ❌ version.txt 手动复制失败！
    pause
    exit /b 1
)

:: ==============================================================================
:: [7] 校验关键文件（含哈希计算）
:: ==============================================================================
echo.
echo [校验] 验证关键文件完整性...

:: 验证主程序 EXE 存在性
if not exist "!MAIN_EXE!" (
    echo ❌ 主程序 EXE 不存在: !MAIN_EXE!
    pause
    exit /b 1
)

:: 新增：验证version.txt存在性
if not exist "!VERSION_FILE!" (
    echo ❌ 主程序目录缺失 version.txt: !VERSION_FILE!
    pause
    exit /b 1
) else (
    echo   ✅ version.txt 已确认存在于主程序目录。
)

:: 检查主程序大小（>5MB）
for %%f in ("!MAIN_EXE!") do set "SIZE=%%~zf"
if !SIZE! lss 5000000 (
    echo ❌ 主程序文件太小（!SIZE! 字节），可能损坏！
    pause
    exit /b 1
)
echo   ✅ 主程序 EXE 验证通过（大小：!SIZE! 字节）。

:: 验证 64 位 PE
if exist "check_pe64.py" (
    python check_pe64.py "!MAIN_EXE!" | findstr "^True$" >nul
    if errorlevel 1 (
        echo ❌ 主程序不是 64 位可执行文件！
        pause
        exit /b 1
    )
    echo   ✅ 主程序是 64 位可执行文件。
) else (
    echo ⚠️ check_pe64.py 不存在，跳过 64 位校验。
)

:: 验证所有关键文件（新增version.txt到校验列表）
set "KEY_FILES=%APP_NAME%.exe !PYTHON_DLL_NAME! updater.exe version.txt"
for %%f in (!KEY_FILES!) do (
    if not exist "!MAIN_APP_DIR!\%%~nxf" (
        echo ❌ 缺失关键文件: %%~nxf
        pause
        exit /b 1
    )
)
echo   ✅ 所有关键文件均已验证通过！

:: 【核心修改】计算主程序SHA256并保存到环境变量
echo [校验] 计算主程序SHA256...
for /f "delims=" %%h in ('powershell -command "$hash = (Get-FileHash -Path '!MAIN_EXE!' -Algorithm SHA256).Hash; $hash.ToLower()"') do set "MAIN_EXE_HASH=%%h"
echo   主程序SHA256: !MAIN_EXE_HASH!

:: ==============================================================================
:: [8] 【可选】打包单文件更新包
:: ==============================================================================
set /p SKIP_SINGLE="是否跳过单文件构建？(Y/n): "
if /i "!SKIP_SINGLE!"=="Y" goto :skip_single

echo.
echo [3/3] 打包单文件更新包（可能耗时较长）...
pyinstaller --clean --onefile --windowed --name "%APP_NAME%" --icon=assets/app.ico ^
    --add-binary "!PYTHON_DLL_PATH!;." ^
    --add-data "spiders;spiders" ^
    --add-data "config.json;." ^
    --add-data "utils;utils" ^
    --add-data "cookies;cookies" ^
    --add-data "config;config" ^
    --add-data "config;version_checker" ^
    --add-data "config;update_manager" ^
    --add-data "version.txt;." ^
    --hidden-import=customtkinter ^
    --hidden-import=tkinter ^
    --hidden-import=PIL ^
    --hidden-import=requests ^
    main.py

if exist "%DIST_DIR%\%APP_NAME%.exe" (
    copy /Y "%DIST_DIR%\%APP_NAME%.exe" "%RELEASE_DIR%\" >nul
    echo   ✅ 单文件更新包已生成。
) else (
    echo   ⚠️ 单文件构建失败，将仅使用目录模式 ZIP 包作为更新源。
)
:skip_single

:: ==============================================================================
:: [9] 创建 ZIP 更新包
:: ==============================================================================
echo.
echo [更新包] 创建 %APP_NAME%_v%VERSION%.zip ...
powershell Compress-Archive -Path "!MAIN_APP_DIR!\*" -DestinationPath "%RELEASE_DIR%\%APP_NAME%_v%VERSION%.zip" -Force
if errorlevel 1 (
    echo ❌ ZIP 压缩失败！
    pause
    exit /b 1
)
set "UPDATE_ZIP=%APP_NAME%_v%VERSION%.zip"
if not exist "%RELEASE_DIR%\%UPDATE_ZIP%" (
    echo ❌ 更新包未生成！
    pause
    exit /b 1
)
echo   ✅ 更新包已生成: %RELEASE_DIR%\%UPDATE_ZIP%

:: 【最终修复】验证 ZIP 包中是否包含 version.txt（兼容所有 PowerShell 版本，修正语法错误）
echo [更新包] 验证 ZIP 包中是否包含 version.txt...
powershell -command "$zipPath = '%RELEASE_DIR%\%UPDATE_ZIP%'; $tempDir = 'temp_zip_check'; if (Test-Path $tempDir) { Remove-Item -Path $tempDir -Recurse -Force | Out-Null }; Expand-Archive -Path $zipPath -DestinationPath $tempDir -Force; $found = Test-Path (Join-Path $tempDir 'version.txt'); Remove-Item -Path $tempDir -Recurse -Force | Out-Null; if (-not $found) { exit 1 }"
if errorlevel 1 (
    echo ❌ ZIP 包中未找到 version.txt，压缩过程异常！
    pause
    exit /b 1
)
echo   ✅ ZIP 包中已确认包含 version.txt。

:: ==============================================================================
:: [10] 生成 latest.json 并校验哈希一致性
:: ==============================================================================
echo.
echo [信息] 正在生成 latest.json...
python generate_latest.py "!MAIN_EXE_HASH!"
if errorlevel 1 (
    echo ❌ latest.json 生成失败！请检查 generate_latest.py
    pause
    exit /b 1
)
if not exist "%RELEASE_DIR%\latest.json" (
    echo ❌ latest.json 未生成！
    pause
    exit /b 1
)

:: 验证 latest.json 中的哈希与主程序一致
echo [校验] 读取 latest.json 中的哈希...
for /f "delims=" %%j in ('powershell -command "$json = Get-Content '%RELEASE_DIR%\latest.json' | ConvertFrom-Json; $json.exe_sha256.ToLower()"') do set "JSON_HASH=%%j"
echo   latest.json中的SHA256: !JSON_HASH!

if "!MAIN_EXE_HASH!" neq "!JSON_HASH!" (
    echo ❌ 哈希值不匹配！latest.json 中的值与实际主程序不符。
    echo     请检查 generate_latest.py 中SHA256的计算逻辑。
    pause
    exit /b 1
)
echo   ✅ SHA256 哈希一致，验证通过！

:: ==============================================================================
:: [11] 完成提示
:: ==============================================================================
echo.
echo ==============================================
echo ✅ 构建完成！🎉
echo ==============================================
echo 发布目录:     %cd%\%RELEASE_DIR%
echo 安装源目录:   !MAIN_APP_DIR!
echo 更新包:       %RELEASE_DIR%\%UPDATE_ZIP%
echo 单文件程序:   %RELEASE_DIR%\%APP_NAME%.exe（若未跳过）
echo 主程序SHA256: !MAIN_EXE_HASH!
echo ==============================================
echo 下一步：
echo   1. 用 Inno Setup 编译 installer\setup.iss
echo   2. 将以下文件上传至服务器 http://115.120.195.74/ ：
echo        - %RELEASE_DIR%\%UPDATE_ZIP%
echo        - %RELEASE_DIR%\latest.json
echo      （如生成了单文件）- %RELEASE_DIR%\%APP_NAME%.exe
echo   3. 【重要】在干净 Win10/11 虚拟机中测试安装包！
echo ==============================================
echo.
pause